package com.rong.juc_test.juc_base.lock;

import java.util.concurrent.TimeUnit;
/**
 * ● 修饰代码块：被修饰的代码块称为同步代码块，作用对象是调用这个代码块的对象
 * ● 修饰方法：被修饰的方法称为同步方法 锁是当前实例对象
 * ● 修饰静态方法：作用范围是整个方法，作用对象是这个类的所有对象 锁是当前类的Class对象
 */

/**
 * 锁的八个问题:
 *
 * 1. 标准访问 加了sleep 唯一结果
 * ----sendSMS
 * ----sendEmail
 *
 * 2. 在短信停4s
 * ----sendSMS
 * ----sendEmail
 *1-2 锁的是当前对象
 * 3. 普通方法 先hello后短信
 * ----getHello
 * ----sendSMS
 *
 * 4. 两个手机
 * ----sendEmail
 * ----sendSMS
 * 锁的是当前对象 两个对象用的是两个不同的锁
 *
 * 5. 两个静态方法 1个手机
 * ----sendSMS
 * ----sendEmail
 *
 *
 * 6. 两个静态方法 两个手机
 * ----sendSMS
 * ----sendEmail
 *
 * 7. 一个静态方法 一个普通方法 一个手机
 * ----sendEmail
 * ----sendSMS
 *
 * 8. 1个静态方法 一个普通方法 两个手机
 * ----sendEmail
 * ----sendSMS
 */
public class Lock_8 {
    public static void main(String[] args) throws InterruptedException {
        Phone phone = new Phone();
        Phone phone2 = new Phone();

        new Thread(() -> {
            try {
                phone.sendSMS();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        },"AA").start();

        Thread.sleep(100);

        new Thread(() -> {
            try {
//                phone.sendEmail();
//                phone.getHello();
                phone2.sendEmail();
            } catch (Exception e) {
                e.printStackTrace();
            }
        },"BB").start();

    }
}

class Phone{

    public static  void sendEmail() throws InterruptedException {
        System.out.println("----sendEmail");

    }

    public static synchronized void sendSMS() throws InterruptedException {
        TimeUnit.SECONDS.sleep(4);
        System.out.println("----sendSMS");
    }

    public void getHello(){
        System.out.println("----getHello");
    }

}
